package controlmercancias.gui.administracion;

import controlmercancias.dominio.Tren;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JDialog;

import controlmercancias.dominio.Usuario;
import controlmercancias.remoto.servidortren.ServidorTrenDemon;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class FormularioAdministrador extends JDialog {

    private JTextField nombre;
    private JPasswordField pass;
    private JPasswordField repass;
    private JCheckBox admin;
    private JList trenes;

    public FormularioAdministrador(final Usuario u, boolean conectado) {
        this.setTitle("Nuevo usuario");
        this.setLayout(new BorderLayout());
        this.setModalityType(ModalityType.APPLICATION_MODAL);
        nombre = new JTextField(10);
        pass = new JPasswordField(20);
        repass = new JPasswordField(20);
        admin = new JCheckBox();
        trenes = new JList();

        JPanel centro = new JPanel();
        BoxLayout bl = new BoxLayout(centro, BoxLayout.Y_AXIS);
        centro.setLayout(bl);
        JPanel panelAux = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panelAux.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
        panelAux.add(new JLabel("Nombre:"));
        panelAux.add(nombre);
        centro.add(panelAux);
        panelAux = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panelAux.setBorder(BorderFactory.createEmptyBorder(10, 0, -5, 0));
        panelAux.add(new JLabel("Contraseña:"));
        panelAux.add(pass);
        centro.add(panelAux);
        panelAux = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panelAux.setBorder(BorderFactory.createEmptyBorder(-5, 0, 10, 0));
        panelAux.add(new JLabel("Repetir contraseña:"));
        panelAux.add(repass);
        centro.add(panelAux);
        panelAux = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panelAux.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
        panelAux.add(new JLabel("Es administrador:"));
        panelAux.add(admin);
        centro.add(panelAux);
        panelAux = new JPanel(new GridLayout(1, 1));
        panelAux.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0), "Trenes"));
        JScrollPane jsp = new JScrollPane(trenes, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        panelAux.add(jsp);
        centro.add(panelAux);
        this.add(centro, BorderLayout.CENTER);

        panelAux = new JPanel(new FlowLayout(FlowLayout.CENTER));
        JButton aceptar = new JButton("Aceptar");
        aceptar.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (pass.getPassword().length != repass.getPassword().length) {
                    JOptionPane.showMessageDialog(FormularioAdministrador.this, "Las contraseñas no son iguales", "Error", JOptionPane.ERROR_MESSAGE);
                    pass.setText("");
                    repass.setText("");
                    pass.requestFocus();
                    return;
                }
                for (int i = 0; i < pass.getPassword().length; i++) {
                    if (pass.getPassword()[i] != repass.getPassword()[i]) {
                        JOptionPane.showMessageDialog(FormularioAdministrador.this, "Las contraseñas no son iguales", "Error", JOptionPane.ERROR_MESSAGE);
                        pass.setText("");
                        repass.setText("");
                        pass.requestFocus();
                        return;
                    }
                }
                String n = nombre.getText();
                if (u == null && ServidorTrenDemon.getAccesoDatos().isUsuario(n)) {
                    JOptionPane.showMessageDialog(FormularioAdministrador.this, "El usuario con nombre " + n + " ya existe. \nEscoge otro nombre de usuario", "Error", JOptionPane.ERROR_MESSAGE);
                    nombre.requestFocus();
                    nombre.setSelectionStart(0);
                    nombre.setSelectionEnd(nombre.getText().length());
                    return;
                }
                Object[] selection = trenes.getSelectedValues();
                if (selection.length == 0) {
                    JOptionPane.showMessageDialog(FormularioAdministrador.this, "Hay que escoger al menos un tren", "Error", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                String p = "";
                for (char s : pass.getPassword()) {
                    p += s;
                }
                ArrayList<Tren> t = new ArrayList<Tren>(selection.length);
                for (Object o : selection) {
                    t.add((Tren) o);
                }
                Usuario usuario = new Usuario(n, p, admin.isSelected(), t);
                if (u == null) {
                    ServidorTrenDemon.getAccesoDatos().addUsuario(usuario);
                } else {
                    ServidorTrenDemon.getAccesoDatos().setUsuario(usuario);
                }
                FormularioAdministrador.this.setEnabled(false);
                FormularioAdministrador.this.dispose();
            }
        });
        JButton cancelar = new JButton("Cancelar");
        cancelar.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                FormularioAdministrador.this.setEnabled(false);
                FormularioAdministrador.this.dispose();
            }
        });
        panelAux.add(aceptar);
        panelAux.add(cancelar);
        this.add(panelAux, BorderLayout.SOUTH);

        List<Tren> allTrenes = ServidorTrenDemon.getAllTrenes();
        DefaultListModel dlm = new DefaultListModel();
        for (Tren t : allTrenes) {
            dlm.addElement(t);
        }
        trenes.setModel(dlm);

        if (u != null) {
            cargarDatosEnFormulario(u, conectado);
        }
        this.setSize(500, 500);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setIconImage(ServidorTrenDemon.appIcon);
    }

    private void cargarDatosEnFormulario(Usuario u, boolean conectado) {
        this.setTitle("Modificando usuario " + u.getNombre());
        nombre.setText(u.getNombre());
        nombre.setEnabled(false);
        ArrayList<Tren> listaTrenes = u.getListaTrenes();
        int[] indices = new int[listaTrenes.size()];
        for (int i = 0; i < listaTrenes.size(); i++) {
            trenes.setSelectedValue(listaTrenes.get(i), false);
            indices[i] = trenes.getSelectedIndex();
        }
        trenes.setSelectedIndices(indices);
        admin.setSelected(u.isAdministrador());
        if(conectado) {
            trenes.setEnabled(false);
        }
    }
}
